package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.model.SS1_CentroDocente;
import edu.uoc.tds.pec4.model.SS1_Usuario;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.LanguageUtils;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 *
 * @author Juan Sena Cuchillero
 * @version 1.0
 */

public class SS1_PanelGestionarUsuario extends JPanelBase {
    private SS4_PantallaMenu padre;
    private JButton jb_aceptar;
    private JButton jb_cancelar;
    private List<JLabel> labels;
    private List<JTextField> textfields;
    private JRadioButton rb_Admin;
    private JRadioButton rb_PerSe;
    private JRadioButton rb_Asist;
    private ButtonGroup bg_perfil;
    private JRadioButton rb_rol1;
    private JRadioButton rb_rol2;
    private JRadioButton rb_rol3;
    private JRadioButton rb_rol4;
    private ButtonGroup bg_rol;
    private JRadioButton rb_masc;
    private JRadioButton rb_feme;
    private ButtonGroup bg_sexo;
    private JComboBox jcb_tipoDoc;
    private JComboBox jcb_paisDoc;
    private JComboBox jcb_paisRes;
    private JComboBox jcb_centro;
    private List<String> paises;
    private List<SS1_CentroDocente> centros;
    private List<String> nombresCentros;
    private SS1_PanelConsultaUsuarios consulta;
    private int idUsuario;
    
    /**
     * 
     * @param padre ventana donde se incrusta este panel
     */
    public SS1_PanelGestionarUsuario(SS4_PantallaMenu padre) {
        super(new BorderLayout());
        this.padre = padre;
        iniciarComponentes();
    }
    
    private void iniciarComponentes(){
        jb_aceptar = new JButton(LanguageUtils.getMessage
                ("SS1.Aceptar"));
        jb_aceptar.setFocusable(false);
        jb_cancelar = new JButton(LanguageUtils.getMessage
                ("SS1.Cancelar"));
        jb_cancelar.setFocusable(false);
        if (consulta != null) jb_cancelar.setText(LanguageUtils.getMessage("SS1.Volver"));
        JPanel pSur = new JPanel();
        pSur.add(jb_aceptar);
        pSur.add(jb_cancelar);
        add(pSur, BorderLayout.SOUTH);

        labels = new ArrayList<JLabel>();
        for (int i = 0; i < 27;i++){
            JLabel l = new JLabel(LanguageUtils.getMessage
                ("SS1_PanelGU.label" + i));
            l.setFocusable(false);
            labels.add(l);
        }

        textfields = new ArrayList<JTextField>();
        for (int i = 0; i < 19;i++){
            JTextField tf = new JTextField();
            tf.setText("");
            tf.setColumns(10);
            textfields.add(tf);
        }

        textfields.get(1).setFocusable(false);
        textfields.get(14).setFocusable(false);

        rb_Admin = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelGU.rb_Admin"));
        rb_Admin.setFocusable(false);
        rb_PerSe = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelGU.rb_PerSe"));
        rb_PerSe.setFocusable(false);
        rb_Asist = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelGU.rb_Asist"));
        rb_Asist.setFocusable(false);
        rb_Asist.setSelected(true);
        bg_perfil = new ButtonGroup();
        bg_perfil.add(rb_Admin);
        bg_perfil.add(rb_PerSe);
        bg_perfil.add(rb_Asist);
        rb_rol1 = new JRadioButton(LanguageUtils.getMessage
                ("SS1.TipoRol1"));
        rb_rol1.setFocusable(false);
        rb_rol1.setSelected(true);
        rb_rol2 = new JRadioButton(LanguageUtils.getMessage
                ("SS1.TipoRol2"));
        rb_rol2.setFocusable(false);
        rb_rol3 = new JRadioButton(LanguageUtils.getMessage
                ("SS1.TipoRol3"));
        rb_rol3.setFocusable(false);
        rb_rol4 = new JRadioButton(LanguageUtils.getMessage
                ("SS1.TipoRol4"));
        rb_rol4.setFocusable(false);
        bg_rol = new ButtonGroup();
        bg_rol.add(rb_rol1);
        bg_rol.add(rb_rol2);
        rb_masc = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelGU.rb_masc"));
        rb_masc.setFocusable(false);
        rb_feme = new JRadioButton(LanguageUtils.getMessage
                ("SS1_PanelGU.rb_feme"));
        rb_feme.setFocusable(false);
        rb_masc.setSelected(true);
        bg_sexo = new ButtonGroup();
        bg_sexo.add(rb_masc);
        bg_sexo.add(rb_feme);
        String[] tiposDoc = {"DNI", "NIF", "NIE"};
        jcb_tipoDoc = new JComboBox(tiposDoc);
        try {
            paises = padre.getRemotoMantenimiento().getPaises();
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }
        jcb_paisDoc = new JComboBox(paises.toArray());
        jcb_paisRes = new JComboBox(paises.toArray());

        try {
            centros = padre.getRemotoMantenimiento().getCentrosDocentes();
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }
        nombresCentros = new ArrayList<String>();
        for (int i = 0;i < centros.size();i++) {
            nombresCentros.add(centros.get(i).getNombre());
        }
        jcb_centro = new JComboBox(nombresCentros.toArray());
        textfields.get(14).setText(centros.get(jcb_centro.getSelectedIndex()).
                    getUniversidad().getNombre());

        JPanel pCentro = new JPanel(new GridLayout(16, 1));
        ArrayList<JPanel> paneles = new ArrayList<JPanel>();
        for (int i = 0; i < 16; i++) {
            paneles.add(new JPanel());
        }
        paneles.get(0).add(labels.get(0));
        paneles.get(1).add(rb_Asist);
        paneles.get(1).add(rb_PerSe);
        paneles.get(1).add(rb_Admin);
        paneles.get(2).add(labels.get(1));
        paneles.get(2).add(textfields.get(0));
        paneles.get(2).add(labels.get(4));
        paneles.get(2).add(textfields.get(1));
        paneles.get(3).add(labels.get(2));
        paneles.get(3).add(textfields.get(2));
        paneles.get(3).add(labels.get(5));
        paneles.get(3).add(textfields.get(3));
        paneles.get(4).add(labels.get(3));
        paneles.get(4).add(textfields.get(4));
        paneles.get(4).add(labels.get(6));
        paneles.get(4).add(textfields.get(5));
        paneles.get(5).add(labels.get(7));
        paneles.get(5).add(jcb_tipoDoc);
        paneles.get(5).add(labels.get(8));
        paneles.get(5).add(textfields.get(6));
        paneles.get(6).add(labels.get(9));
        paneles.get(6).add(textfields.get(7));
        paneles.get(7).add(labels.get(10));
        paneles.get(7).add(textfields.get(8));
        paneles.get(7).add(labels.get(11));
        paneles.get(7).add(textfields.get(9));
        paneles.get(8).add(labels.get(12));
        paneles.get(8).add(jcb_paisDoc);
        paneles.get(8).add(labels.get(15));
        paneles.get(8).add(rb_masc);
        paneles.get(8).add(rb_feme);
        paneles.get(9).add(labels.get(13));
        paneles.get(9).add(textfields.get(10));
        paneles.get(9).add(labels.get(16));
        paneles.get(9).add(textfields.get(11));
        paneles.get(9).add(labels.get(26));
        paneles.get(9).add(jcb_paisRes);
        paneles.get(9).add(labels.get(14));
        paneles.get(9).add(textfields.get(12));
        paneles.get(9).add(labels.get(17));
        paneles.get(9).add(textfields.get(13));
        paneles.get(10).add(labels.get(18));
        paneles.get(10).add(textfields.get(14));
        paneles.get(11).add(labels.get(19));
        paneles.get(11).add(jcb_centro);
        paneles.get(12).add(labels.get(20));
        paneles.get(13).add(rb_rol1);
        paneles.get(13).add(rb_rol2);
        paneles.get(13).add(rb_rol3);
        paneles.get(13).add(rb_rol4);
        paneles.get(14).add(labels.get(21));
        paneles.get(15).add(labels.get(22));
        paneles.get(15).add(textfields.get(15));
        paneles.get(15).add(labels.get(23));
        paneles.get(15).add(textfields.get(16));
        paneles.get(15).add(labels.get(24));
        paneles.get(15).add(textfields.get(17));
        paneles.get(15).add(labels.get(25));
        paneles.get(15).add(textfields.get(18));

        for (int i = 0; i < paneles.size(); i++) {
            pCentro.add(paneles.get(i));
        }
        add(pCentro, BorderLayout.CENTER);
        jb_aceptar.addActionListener(padre);
        jb_cancelar.addActionListener(padre);
        jcb_centro.addActionListener(padre);
        rb_Admin.addActionListener(padre);
        rb_PerSe.addActionListener(padre);
        rb_Asist.addActionListener(padre);
    }

    @Override
    public void componentePulsado(ActionEvent e) {
        if (e.getSource() == jb_aceptar){
            try {
                if (consulta == null){
                    SS1_Usuario usuario = getUsuario();
                    if (usuario != null) {
                        padre.getRemotoMantenimiento().insertUsuario(usuario);
                        padre.setPanelCentral(new SS4_PanelInicial());
                    }
                } else {
                    SS1_Usuario usuario = getUsuario();
                    if (usuario != null){
                        padre.getRemotoMantenimiento().updateUsuario(idUsuario, usuario);
                        padre.setPanelCentral(consulta);
                        padre.repaint();
                    }
                }
            } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }

        } else if (e.getSource() == jb_cancelar){
            if (consulta == null) padre.setPanelCentral(new SS4_PanelInicial());
            else {
                padre.setPanelCentral(consulta);
                padre.repaint();
            }

        } else if (e.getSource() == jcb_centro){
            textfields.get(14).setText(centros.get(jcb_centro.getSelectedIndex()).
                    getUniversidad().getNombre());

        } else if (e.getSource() == rb_Admin){
            labels.get(20).setVisible(false);
            rb_rol1.setVisible(false);
            rb_rol2.setVisible(false);
            rb_rol3.setVisible(false);
            rb_rol4.setVisible(false);
            labels.get(21).setVisible(false);
            labels.get(22).setVisible(false);
            textfields.get(15).setVisible(false);
            labels.get(23).setVisible(false);
            textfields.get(16).setVisible(false);
            labels.get(24).setVisible(false);
            textfields.get(17).setVisible(false);
            labels.get(25).setVisible(false);
            textfields.get(18).setVisible(false);

        } else if (e.getSource() == rb_PerSe){
            labels.get(20).setVisible(false);
            rb_rol1.setVisible(false);
            rb_rol2.setVisible(false);
            rb_rol3.setVisible(false);
            rb_rol4.setVisible(false);
            labels.get(21).setVisible(false);
            labels.get(22).setVisible(false);
            textfields.get(15).setVisible(false);
            labels.get(23).setVisible(false);
            textfields.get(16).setVisible(false);
            labels.get(24).setVisible(false);
            textfields.get(17).setVisible(false);
            labels.get(25).setVisible(false);
            textfields.get(18).setVisible(false);

        } else if (e.getSource() == rb_Asist){
            labels.get(20).setVisible(true);
            rb_rol1.setVisible(true);
            rb_rol2.setVisible(true);
            rb_rol3.setVisible(true);
            rb_rol4.setVisible(true);
            labels.get(21).setVisible(true);
            labels.get(22).setVisible(true);
            textfields.get(15).setVisible(true);
            labels.get(23).setVisible(true);
            textfields.get(16).setVisible(true);
            labels.get(24).setVisible(true);
            textfields.get(17).setVisible(true);
            labels.get(25).setVisible(true);
            textfields.get(18).setVisible(true);
        }
    }

    private SS1_Usuario getUsuario() {
        DateFormat df = new SimpleDateFormat("dd/mm/yyyy");

        SS1_Usuario usuario = new SS1_Usuario();

        if (isNotNull(textfields.get(0).getText(), labels.get(1)))
            usuario.setNombre(textfields.get(0).getText());
        else return null;
        if (isNotNull(textfields.get(2).getText(), labels.get(2)))
            usuario.setApellido1(textfields.get(2).getText());
        else return null;
        if (isNotNull(textfields.get(4).getText(), labels.get(3)))
            usuario.setApellido2(textfields.get(4).getText());
        else return null;
        usuario.setVaron(rb_masc.isSelected());
        try {
            usuario.setFechaNacimiento(df.parse(textfields.get(11).getText()));
        } catch (ParseException ex) {
            ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje7"));
            return null;
        }
        usuario.setPaisDocumento((String)jcb_paisDoc.getSelectedItem());
        usuario.setTipoDocumento((String)jcb_tipoDoc.getSelectedItem());
        if (isNotNull(textfields.get(6).getText(), labels.get(8)))
            usuario.setNumeroDocumento(textfields.get(6).getText());
        else return null;
        if (isNotNull(textfields.get(7).getText(), labels.get(9)))
            usuario.setDireccion(textfields.get(7).getText());
        else return null;
        if (isNotNull(textfields.get(8).getText(), labels.get(10)))
            usuario.setLocalidad(textfields.get(8).getText());
        else return null;
        try {
            if (isNotNull(textfields.get(9).getText(), labels.get(11)))
                usuario.setCodigoPostal(Integer.parseInt(textfields.get(9).getText()));
            else return null;
        } catch (NumberFormatException e) {
            ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje6"));
            return null;
        }
        usuario.setPaisResidencia((String)jcb_paisRes.getSelectedItem());
        usuario.setTelefono(textfields.get(13).getText());
        usuario.setEmail(textfields.get(10).getText());
        usuario.setWeb(textfields.get(12).getText());
        try {
            usuario.setCodigo(padre.getRemotoMantenimiento().getCodigo(usuario.getNombre(),
                    usuario.getApellido1(), usuario.getApellido2()));
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }
        if (textfields.get(3).getText().equals(textfields.get(5).getText())){
            if (isNotNull(textfields.get(3).getText(), labels.get(5)))
            usuario.setContrasenya(textfields.get(3).getText());
            else return null;
        } else {
            ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje5"));
            return null;
        }
        if (rb_Admin.isSelected()){
            usuario.setTipoUsuario(0);
        } else if (rb_PerSe.isSelected()){
            usuario.setTipoUsuario(1);
        } else if (rb_Asist.isSelected()){
            usuario.setTipoUsuario(2);
        }

        switch (usuario.getTipoUsuario()){
            case 2: {
                if (rb_rol1.isSelected()) usuario.setRol(0);
                else if(rb_rol2.isSelected()) usuario.setRol(1);
                else if(rb_rol3.isSelected()) usuario.setRol(2);
                else if(rb_rol4.isSelected()) usuario.setRol(3);
                try {
                    if (isNotNull(textfields.get(15).getText(), labels.get(22))){
                        Integer.parseInt(textfields.get(15).getText());
                        usuario.setBanco(textfields.get(15).getText());
                    }
                    else return null;
                    if (isNotNull(textfields.get(16).getText(), labels.get(23))){
                        Integer.parseInt(textfields.get(16).getText());
                        usuario.setSucursal(textfields.get(16).getText());
                    }
                    else return null;
                    if (isNotNull(textfields.get(17).getText(), labels.get(24))){
                        Integer.parseInt(textfields.get(17).getText());
                        usuario.setDC(textfields.get(17).getText());
                    }
                    else return null;
                    if (isNotNull(textfields.get(18).getText(), labels.get(25))){
                        Integer.parseInt(textfields.get(18).getText());
                        usuario.setCuenta(textfields.get(18).getText());
                    }
                    else return null;
                } catch (NumberFormatException e){
                    ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje4"));
                }
            };
            case 1:
            case 0: {
                usuario.setCentroDocente(centros.get(jcb_centro.getSelectedIndex()));
            };
        }
        if (consulta == null){
            usuario.setActivo(true);
            Date d = new Date(System.currentTimeMillis());
            usuario.setFechaActividad(d);
            usuario.setFechaAlta(d);
        }

        return usuario;
    }

    public void setUsuario(SS1_Usuario usuario) {
        idUsuario = usuario.getId();

        textfields.get(0).setText(usuario.getNombre());
        textfields.get(2).setText(usuario.getApellido1());
        textfields.get(4).setText(usuario.getApellido2());
        rb_feme.setSelected(!usuario.isVaron());
        textfields.get(11).setText(usuario.getFechaNacimiento().toString());
        jcb_paisDoc.setSelectedItem(usuario.getPaisDocumento());
        jcb_tipoDoc.setSelectedItem(usuario.getTipoDocumento());
        textfields.get(6).setText(usuario.getNumeroDocumento());
        textfields.get(7).setText(usuario.getDireccion());
        textfields.get(8).setText(usuario.getLocalidad());
        textfields.get(9).setText(Integer.toString(usuario.getCodigoPostal()));
        jcb_paisRes.setSelectedItem(usuario.getPaisResidencia());
        textfields.get(13).setText(usuario.getTelefono());
        textfields.get(10).setText(usuario.getEmail());
        textfields.get(12).setText(usuario.getWeb());
        textfields.get(1).setText(usuario.getCodigo());
        textfields.get(3).setText(usuario.getContrasenya());
        textfields.get(5).setText(usuario.getContrasenya());

        switch (usuario.getTipoUsuario()){
            case 0: rb_Admin.doClick(); break;
            case 1: rb_PerSe.doClick(); break;
            case 2: rb_Asist.doClick(); break;
        }

        switch (usuario.getTipoUsuario()){
            case 2: {
                switch (usuario.getRol()){
                    case 0: rb_rol1.setSelected(true); break;
                    case 1: rb_rol2.setSelected(true); break;
                    case 2: rb_rol3.setSelected(true); break;
                    case 3: rb_rol4.setSelected(true); break;
                }
                textfields.get(15).setText(usuario.getBanco());
                textfields.get(16).setText(usuario.getSucursal());
                textfields.get(17).setText(usuario.getDC());
                textfields.get(18).setText(usuario.getCuenta());
            }
            case 1:
            case 0: {
                jcb_centro.setSelectedItem(usuario.getCentroDocente().getNombre());
                textfields.get(14).setText(usuario.getCentroDocente().getUniversidad().getNombre());
            }
        }
    }

    private boolean isNotNull(String text, JLabel l){
        if (text.equals("") || text == null){
            ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje2") +
                    " " + l.getText().toUpperCase() + " " +
                    LanguageUtils.getMessage("SS1_Mensaje3"));
            return false;
        }
        return true;
    }

    public SS1_PanelConsultaUsuarios getConsulta() {
        return consulta;
    }

    public void setConsulta(SS1_PanelConsultaUsuarios consulta) {
        this.consulta = consulta;
    }
}
